package com.rm.zeyou.task;


import com.rm.zeyou.service.*;
import com.rm.zeyou.util.task.SpringContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * Description: 定时任务
 *
 * @author : YanYang
 * @date : 2023/7/27 11:51
 */
@Slf4j
@Component
public class TimedTasks {

    /**
     * 一分钟执行一次  记录技师在线时长
     * @Date 2025 3月 17 11:35
     */
    @Scheduled(cron = "0 * * * * ? ")
    @Async("taskExecutor")
    public void updateTechnicianOnlineTime() {
        log.debug("===================================================记录在线时长定时任务开始执行===================================================");
        TechnicianService technicianService = SpringContextUtil.getBean(TechnicianService.class);
        technicianService.updateTechnicianOnlineTime();
        log.debug("===================================================记录在线时长定时任务结束执行===================================================");
    }

    /**
     * 凌晨十二点执行一次 技师时间 清除昨天时间 并添加第三天时间
     */
    @Scheduled(cron = "0 0 0 * * ? ")
    @Async("taskExecutor")
    public void addTechnicianTime()  {
        log.debug("===================================================更新技师时间定时任务开始执行===================================================");
        TechnicianTimeService technicianTimeService = SpringContextUtil.getBean(TechnicianTimeService.class);
        technicianTimeService.addTechnicianTime();
        log.debug("===================================================更新技师时间定时任务结束执行===================================================");
    }

    /**
     * 30秒执行一次 将到期或未使用的优惠券改为过期状态
     */
    @Scheduled(cron = "0,5 * * * * ? ")
    @Async("taskExecutor")
    public void updateUserCouponStatus()  {
        log.debug("===================================================更新用户优惠券状态定时任务开始执行===================================================");
        UserCouponService userCouponService = SpringContextUtil.getBean(UserCouponService.class);
        userCouponService.updateUserCouponStatus();
        log.debug("===================================================更新用户优惠券状态定时任务结束执行===================================================");
    }

    /**
     * 五秒执行一次 将超时未接单的订单 关闭 并退还金额
     */
    @Scheduled(cron = "0,5 * * * * ? ")
    @Async("taskExecutor")
    public void closeOrder()  {
        log.debug("===================================================关闭未接单超时订单定时任务开始执行===================================================");
        UserItemOrderService userItemOrderService = SpringContextUtil.getBean(UserItemOrderService.class);
        userItemOrderService.closeOrder();
        log.debug("===================================================关闭未接单超时订单定时任务结束执行===================================================");
    }

    /**
     * 每秒执行 将10分钟未支付的订单关闭
     */
    @Scheduled(cron = "* * * * * ? ")
    @Async("taskExecutor")
    public void closeNotPayOrderStatus()  {
        log.debug("===================================================关闭未支付订单定时任务开始执行===================================================");
        UserItemOrderService userItemOrderService = SpringContextUtil.getBean(UserItemOrderService.class);
        userItemOrderService.closeNotPayOrderStatus();
        log.debug("===================================================关闭未支付订单定时任务结束执行===================================================");
    }

    /**
     * 一分钟执行一次 将未支付的会员订单删除
     */
    @Scheduled(cron = "0 * * * * ? ")
    @Async("taskExecutor")
    public void closeUserMemberOrder()  {
        log.debug("===================================================关闭未支付会员订单定时任务开始执行===================================================");
        UserMemberOrderService userMemberOrderService = SpringContextUtil.getBean(UserMemberOrderService.class);
        userMemberOrderService.closeUserMemberOrder();
        log.debug("===================================================关闭未支付会员订单定时任务结束执行===================================================");
    }

    /**
     * 一分钟执行一次 将过期会员删除
     */
    @Scheduled(cron = "0 * * * * ? ")
    @Async("taskExecutor")
    public void closeUserMember()  {
        log.debug("===================================================清除会员定时任务开始执行===================================================");
        UserMemberService userMemberService = SpringContextUtil.getBean(UserMemberService.class);
        userMemberService.closeUserMember();
        log.debug("===================================================清除会员定时任务结束执行===================================================");
    }

    /**
     * 限时抢券开场
     */
    @Scheduled(cron = "* * * * * ? ")
    @Async("taskExecutor")
    public void openLimitCoupon() {
        log.debug("===================================================限时抢券开场定时任务开始执行===================================================");
        LimitCouponMatchesConfigService limitCouponMatchesConfigService = SpringContextUtil.getBean(LimitCouponMatchesConfigService.class);
        limitCouponMatchesConfigService.openLimitCoupon();
        log.debug("===================================================限时抢券开场定时任务结束执行===================================================");
    }

    /**
     * 限时抢券结束
     */
    @Scheduled(cron = "* * * * * ? ")
    @Async("taskExecutor")
    public void closeLimitCoupon()  {
        log.debug("===================================================限时抢券结束定时任务开始执行===================================================");
        LimitCouponMatchesConfigService limitCouponMatchesConfigService = SpringContextUtil.getBean(LimitCouponMatchesConfigService.class);
        limitCouponMatchesConfigService.closeLimitCoupon();
        log.debug("===================================================限时抢券结束定时任务结束执行===================================================");
    }

    /**
     * 一分钟执行一次 将技师资金7天后自动解冻
     */
    @Scheduled(cron = "0 * * * * ? ")
    @Async("taskExecutor")
    public void updateTechnicianConsume() throws Exception {
        log.debug("===================================================解冻技师资金定时任务开始执行===================================================");
        TechnicianConsumeDetailService technicianConsumeDetailService = SpringContextUtil.getBean(TechnicianConsumeDetailService.class);
        technicianConsumeDetailService.updateTechnicianConsume();
        log.debug("===================================================解冻技师资金定时任务结束执行===================================================");
    }

    /**
     * 10秒执行一次 超过五分钟未接单的订单给技师语音通知
     */
    @Scheduled(cron = "0/10 * * * * ? ")
    @Async("taskExecutor")
    public void voiceTechnicianToTakeOrder() throws Exception {
        log.debug("===================================================超过五分钟未接单的订单给技师语音通知任务开始执行===================================================");
        UserItemOrderService userItemOrderService = SpringContextUtil.getBean(UserItemOrderService.class);
        userItemOrderService.voiceTechnicianToTakeOrder();
        log.debug("===================================================超过五分钟未接单的订单给技师语音通知定时任务结束执行===================================================");
    }

    /**
     * 20秒执行一次 还剩五分钟结束的订单给技师语音通知
     */
    @Scheduled(cron = "0/20 * * * * ? ")
    @Async("taskExecutor")
    public void voiceTechnicianToEnd() throws Exception {
        log.debug("===================================================还剩五分钟结束的订单给技师语音通知任务开始执行===================================================");
        UserItemOrderService userItemOrderService = SpringContextUtil.getBean(UserItemOrderService.class);
        userItemOrderService.voiceTechnicianToEnd();
        log.debug("===================================================还剩五分钟结束的订单给技师语音通知定时任务结束执行===================================================");
    }

    /**
     * 5秒执行一次 查技师订单是否异常
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    @Async("taskExecutor")
    public void technicianOrderException() throws Exception {
        log.debug("===================================================技师订单是否异常定时任务开始执行===================================================");
        UserItemOrderService userItemOrderService = SpringContextUtil.getBean(UserItemOrderService.class);
        userItemOrderService.technicianOrderException();
        log.debug("===================================================技师订单是否异常定时任务结束执行===================================================");
    }



    /**
     * 1分钟执行一次 查询用户提现表状态不为失败和成功的 直到结果为失败或者成功 失败退还用户余额 成功只改该条记录状态
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    @Async("taskExecutor")
    public void updateUserWithdrawals() {
        log.debug("===================================================修改用户提现状态定时任务开始执行===================================================");
        UserPayoutDetailService userPayoutDetailService = SpringContextUtil.getBean(UserPayoutDetailService.class);
        userPayoutDetailService.updateUserWithdrawals();
        log.debug("===================================================修改用户提现状态定时任务结束执行===================================================");
    }

    /**
     * 1分钟执行一次 查询渠道商提现表状态不为失败和成功的 直到结果为失败或者成功 失败退还用户余额 成功只改该条记录状态
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    @Async("taskExecutor")
    public void updateChannelWithdrawals() {
        log.debug("===================================================修改渠道商提现状态定时任务开始执行===================================================");
        ChannelPayoutDetailService channelPayoutDetailService = SpringContextUtil.getBean(ChannelPayoutDetailService.class);
        channelPayoutDetailService.updateChannelWithdrawals();
        log.debug("===================================================修改渠道商提现状态定时任务结束执行===================================================");
    }

    /**
     * 1分钟执行一次 查询业务员提现表状态不为失败和成功的 直到结果为失败或者成功 失败退还用户余额 成功只改该条记录状态
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    @Async("taskExecutor")
    public void updateSalesmanWithdrawals() {
        log.debug("===================================================修改业务员提现状态定时任务开始执行===================================================");
        SalesmanPayoutDetailService salesmanPayoutDetailService = SpringContextUtil.getBean(SalesmanPayoutDetailService.class);
        salesmanPayoutDetailService.updateSalesmanWithdrawals();
        log.debug("===================================================修改业务员提现状态定时任务结束执行===================================================");
    }

    /**
     * 1分钟执行一次 查询技师提现表状态不为失败和成功的 直到结果为失败或者成功 失败退还用户余额 成功只改该条记录状态
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    @Async("taskExecutor")
    public void updateTechnicianWithdrawals() {
        log.debug("===================================================修改技师提现状态定时任务开始执行===================================================");
        TechnicianPayoutDetailService technicianPayoutDetailService = SpringContextUtil.getBean(TechnicianPayoutDetailService.class);
        technicianPayoutDetailService.updateTechnicianWithdrawals();
        log.debug("===================================================修改技师提现状态定时任务结束执行===================================================");
    }


    /**
     * 1分钟执行一次 查询经纪人提现表状态不为失败和成功的 直到结果为失败或者成功 失败退还用户余额 成功只改该条记录状态
     */
    @Scheduled(cron = "0/1 * * * * ? ")
    @Async("taskExecutor")
    public void updateBrokerWithdrawals() {
        log.debug("===================================================修改经纪人提现状态定时任务开始执行===================================================");
        BrokerPayoutDetailService brokerPayoutDetailService = SpringContextUtil.getBean(BrokerPayoutDetailService.class);
        brokerPayoutDetailService.updateBrokerWithdrawals();
        log.debug("===================================================修改经纪人提现状态定时任务结束执行===================================================");
    }

}
